﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO;
using tea.DB;
using tea.BL;
using tea.Models;

namespace tea.Controllers
{
    [Authorize]
    public class FileController : Controller
    {
        [HttpGet]
        public ActionResult UploadFrame(UploadModel 모델)
        {
            return View(모델);
        }

        [HttpPost]
        public ActionResult UploadFrame(HttpPostedFileBase filedata, UploadModel 모델)
        {
            System.Threading.Thread.Sleep(1000);
            using (var db = new DBDataContext()) {
                if (BL파일.수정권한검사(db, 모델.targetId, 모델.targetType) == false) return Upload실패(모델, Consts.권한없음);

                var 파일크기제한 = 10;
                int.TryParse(System.Configuration.ConfigurationManager.AppSettings["FileUploadSizeMax"], out 파일크기제한);
                string 파일명 = Path.GetFileName(filedata.FileName);
                var 크기 = (int)filedata.InputStream.Length;
                if (크기 >= 파일크기제한 * 1024 * 1024) return Upload실패(모델, Consts.파일크기오류);
                var 버퍼 = new byte[크기];
                filedata.InputStream.Read(버퍼, 0, 크기);

                var 새파일 = new 파일 { 크기 = 크기, 파일명 = 파일명, 내용 = 버퍼, 생성일 = DateTime.Now, 임시 = false };
                db.파일.InsertOnSubmit(새파일);
                db.SubmitChanges();

                var 새첨부 = new 파일첨부 { 파일ID = 새파일.ID, 대상ID = 모델.targetId, 대상유형 = 모델.targetType, 크기 = 크기, 파일명 = 파일명 };
                db.파일첨부.InsertOnSubmit(새첨부);
                db.SubmitChanges();
                BL파일.불필요한파일삭제();

                모델.success = true;
                return View(모델);
            }        
        }

        private ActionResult Upload실패(UploadModel 모델, string 에러메시지)
        {
            모델.success = false;
            모델.message = 에러메시지;
            return View(모델);
        }

        [Util.AjaxOrChildActionOnly]
        public ActionResult List(long targetId, int targetType)
        {
            using (var db = new DBDataContext()) {
                var 모델 = db.파일첨부.Where(p => p.대상ID == targetId && p.대상유형 == targetType).ToList();
                return PartialView("_List", 모델);
            }
        }

        [HttpGet]
        public ActionResult Download(long id)
        {
            using (var db = new DBDataContext()) {
                var 파일 = db.파일.Single(p => p.ID == id);
                return File(파일.내용.ToArray(), "application/octet-stream", 파일.파일명);
            }
        }

        [Util.AjaxOnly] [HttpPost]
        public ActionResult Delete(int id)
        {
            using (var db = new DBDataContext()) {
                var 첨부 = db.파일첨부.Single(p => p.ID == id);
                if (BL파일.수정권한검사(db, 첨부.대상ID, 첨부.대상유형) == false) return Json(Consts.Ajax권한없음);

                db.파일첨부.DeleteOnSubmit(첨부);
                db.SubmitChanges();
                BL파일.불필요한파일삭제();
                return Json(new AjaxSuccessModel());
            }
        }
    }
}
